/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package NajaTaskClient.classes;

import NajaTaskClient.Conexao.Configuracoes;
import NajaTaskClient.Conexao.Db;
import NajaTaskClient.Conexao.DbTabela;
import NajaTaskClient.Conexao.DbTabelaColuna;
import NajaTaskClient.Conexao.ExcecaoGenericaMensagem;
import java.lang.String;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ListIterator;
import java.util.Set;
import java.util.TreeSet;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Nidorx
 */
public class NajaTask {

    Usuario usuario;    
    Set<Grupo> Grupos;
    Set<Usuario> Usuarios;
    private static NajaTask instancia;
    private DbTabela tabelaAtividades;
    private DbTabela tabelaProjetos;
    private DbTabela tabelaRegistros;
    private DbTabela tabelaTarefas;
    private DbTabela tabelaDepartamentos;

    /**
     * retorna a instancia dessa classe
     * @return DbQueries
     */
    public static synchronized NajaTask get() {
        if (instancia == null) {
            instancia = new NajaTask();
        }
        return instancia;
    }

    public NajaTask() {

        String host = Configuracoes.get().obterConfig().obterDbHost();
        String porta = Configuracoes.get().obterConfig().obterDbPort();
        String usario = Configuracoes.get().obterConfig().obterDbUser();
        String senha = Configuracoes.get().obterConfig().obterDbPass();
        String bancoDados = Configuracoes.get().obterConfig().obterDb();

        Db.get().conexaoConfig(host, porta, usario, senha, bancoDados);
        try {
            //conectando
            Db.get().conectar();
            //se nao est� inserido , inserir
                /* if (!tabelaDepartamentos.coluna("codigo").inserido("25")) {
            tabelaDepartamentos.insert("codigo='" + 25 + "',nome='" + "Joao Pessoa" + "'");
            }*/


            this.usuario = new Usuario();
            this.Grupos = new TreeSet<Grupo>();//lista de grupos
            this.Usuarios = new TreeSet<Usuario>();//lista de usuarios
            Grupo grupo = new Grupo();


        } catch (SQLException ex) {
            Logger.getLogger(NajaTask.class.getName()).log(Level.SEVERE, null, ex);
        }



    }

    private void criarTabelasRelacionamento() {
    }

    public void atualizarListaGrupos() {
        try {
            ResultSet listaGrupos = new Grupo().obterListaGrupos();
            Grupos.clear();
            while (listaGrupos.next()) {
                System.out.println("teste");
                Grupos.add(new Grupo(listaGrupos.getString("codigo"), listaGrupos.getString("titulo"), listaGrupos.getString("descricao"), listaGrupos.getInt("ativo")));
            }
        } catch (SQLException ex) {
            Logger.getLogger(NajaTask.class.getName()).log(Level.SEVERE, null, ex);
        }


    }

    public Set<Grupo> obterListaGrupos() {
        this.atualizarListaGrupos();
        return this.Grupos;
    }

     public void atualizarListaUsuarios() {
        try {
            ResultSet rstlistaUsuarios = new Usuario().obterLista();
            Usuarios.clear();
            while (rstlistaUsuarios.next()) {
                System.out.println("teste");
                Usuarios.add(new Usuario(rstlistaUsuarios.getString("codigo"), rstlistaUsuarios.getString("nome"), rstlistaUsuarios.getString("nome_usuario"), rstlistaUsuarios.getInt("ativo")));
            }
        } catch (SQLException ex) {
            Logger.getLogger(NajaTask.class.getName()).log(Level.SEVERE, null, ex);
        }


    }
    public Set<Usuario> obterListaUsuarios() {
        this.atualizarListaUsuarios();
        return this.Usuarios;
    }

    private void conectar() {
        try {
            //criando as tabelas no banco de dados (se não existirem)
            //DbTabelaColuna(String nome, String tipo, int tamanho, boolean nulo, boolean autoIncrementa, boolean primaria)
            //tipos = {"INT", "FLOAT", "DECIMAL", "VARCHAR", "TEXT", "LONGTEXT", "DATE", "TIME"};



            /*tabela de Atividades */

            tabelaAtividades = Db.get().dbTabelaAdicionar(new DbTabela("atividades"));
            tabelaAtividades.campoAdicionar(new DbTabelaColuna("codigo", "INT", 11, false, false, true));
            tabelaAtividades.campoAdicionar(new DbTabelaColuna("codigo_atividade_pai", "INT", 11, false, false, false));
            tabelaAtividades.campoAdicionar(new DbTabelaColuna("titulo", "VARCHAR", 100, false, false, false));
            tabelaAtividades.campoAdicionar(new DbTabelaColuna("descricao", "VARCHAR", 500, false, false, false));
            tabelaAtividades.campoAdicionar(new DbTabelaColuna("ativo", "INT", 1, false, false, false));





            /*tabela de Projetos */
            tabelaProjetos = Db.get().dbTabelaAdicionar(new DbTabela("projetos"));
            tabelaProjetos.campoAdicionar(new DbTabelaColuna("codigo", "INT", 11, false, false, true));
            tabelaProjetos.campoAdicionar(new DbTabelaColuna("nome", "VARCHAR", 100, false, false, false));
            tabelaProjetos.campoAdicionar(new DbTabelaColuna("descricao", "VARCHAR", 500, false, false, false));
            tabelaProjetos.campoAdicionar(new DbTabelaColuna("ativo", "INT", 1, false, false, false));


            /*tabela de PalavrasChave */
            tabelaProjetos = Db.get().dbTabelaAdicionar(new DbTabela("tags"));
            tabelaProjetos.campoAdicionar(new DbTabelaColuna("codigo", "INT", 11, false, false, true));
            tabelaProjetos.campoAdicionar(new DbTabelaColuna("nome", "VARCHAR", 100, false, false, false));

            /*tabela de Tarefas */
            tabelaTarefas = Db.get().dbTabelaAdicionar(new DbTabela("tarefas"));
            tabelaTarefas.campoAdicionar(new DbTabelaColuna("codigo", "INT", 11, false, false, true));
            tabelaTarefas.campoAdicionar(new DbTabelaColuna("nome", "VARCHAR", 100, false, false, false));
            tabelaTarefas.campoAdicionar(new DbTabelaColuna("descricao", "VARCHAR", 500, false, false, false));
            tabelaTarefas.campoAdicionar(new DbTabelaColuna("prioridade", "INT", 1, false, false, false));
            //TODO: tipo DATE nao especificado em DbTabelaColuna.java
            tabelaTarefas.campoAdicionar(new DbTabelaColuna("data_inicio", "DATE", 0, false, false, false));
            tabelaTarefas.campoAdicionar(new DbTabelaColuna("data_fim", "DATE", 0, false, false, false));
            tabelaTarefas.campoAdicionar(new DbTabelaColuna("fim_indeterminado", "INT", 1, false, false, false));
            tabelaTarefas.campoAdicionar(new DbTabelaColuna("percent_concluida", "INT", 11, false, false, false));
            tabelaTarefas.campoAdicionar(new DbTabelaColuna("ativo", "INT", 1, false, false, false));


            /*tabela de Registros */
            tabelaRegistros = Db.get().dbTabelaAdicionar(new DbTabela("registros"));
            tabelaRegistros.campoAdicionar(new DbTabelaColuna("codigo", "INT", 11, false, false, true));
            tabelaRegistros.campoAdicionar(new DbTabelaColuna("nome", "VARCHAR", 100, false, false, false));
            tabelaRegistros.campoAdicionar(new DbTabelaColuna("descricao", "VARCHAR", 500, false, false, false));
            tabelaRegistros.campoAdicionar(new DbTabelaColuna("ativo", "INT", 1, false, false, false));




            //configurando as conexoes


        } catch (ExcecaoGenericaMensagem ex) {
            // ex.printStackTrace();
        }
    }

    public boolean login(String nomeUsuario, String senha) {
        /*verifica se usuário existe no servidor */
        //Vector<String> senhaBD =  this.tabelaUsuarios.coluna("senha").where("nome_usuario="+nomeUsuario);

        if (this.usuario.login(nomeUsuario, senha)) {
            return true;
        }




        return false;
    }
}
